package com.zjsru.leetcode75.level1;

import java.util.Stack;

/**
 * @Author: cookLee
 * @Date: 2023-10-29
 * 从字符串中移除星号
 */
public class RemoveStars {
    /**
     * 主
     * 、
     * 输入：s = "leet**cod*e"
     * 输出："lecoe"
     * 解释：从左到右执行移除操作：
     * - 距离第 1 个星号最近的字符是 "leet**cod*e" 中的 't' ，s 变为 "lee*cod*e" 。
     * - 距离第 2 个星号最近的字符是 "lee*cod*e" 中的 'e' ，s 变为 "lecod*e" 。
     * - 距离第 3 个星号最近的字符是 "lecod*e" 中的 'd' ，s 变为 "lecoe" 。
     * 不存在其他星号，返回 "lecoe" 。
     * 、
     * 输入：s = "erase*****"
     * 输出：""
     * 解释：整个字符串都会被移除，所以返回空字符串。
     * @param args args
     */
    public static void main(String[] args) {
        RemoveStars removeStars = new RemoveStars();
        String s = "**leet**cod*e";
        System.out.println(removeStars.removeStars2(s));
    }

    /**
     * 移除星星
     * 使用StringBuilder模拟栈
     * @param s s
     * @return {@link String}
     */
    public String removeStars(String s) {
        StringBuilder sb = new StringBuilder();
        int index = -1;
        for (char c : s.toCharArray()) {
            if (String.valueOf(c).equals("*")) {
                sb.deleteCharAt(index--);
            } else {
                sb.append(c);
                index++;
            }
        }
        return sb.toString();
    }

    /**
     * 栈
     *
     * @param s s
     * @return {@link String}
     */
    public String removeStars2(String s) {
        Stack<Character> stack = new Stack<>();
        int len = s.length();
        int i = 1;
        stack.push(s.charAt(0));
        while (i < len) {
            if (s.charAt(i) == '*' && !s.isEmpty()) {
                stack.pop();
            } else {
                stack.push(s.charAt(i));
            }
            i++;
        }
        String str = "";
        while (!stack.isEmpty()) {
            str = stack.pop() + str;
        }
        return str;
    }
}
